package fr.esisar.cs420.swt;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wb.swt.SWTResourceManager;

import fr.esisar.cs420.traitement.Album;
import fr.esisar.cs420.traitement.Images;
import fr.esisar.cs420.traitement.InfoAlbum;
import fr.esisar.cs420.traitement.InfoImage;
import fr.esisar.cs420.traitement.Livre;

import org.eclipse.swt.widgets.Combo;




public class GestionLivre extends Shell {
	
	
	private Table table;
	
	int visible = 0 ;
	
	int ordre = 1 ;
	
	int idAlbum = 0 ;
	int idLivre = 0 ;
	
	InfoImage image ;

	String element = null;
	private Text Titre;
	private Text Commentaire;
	private Text erreur;
	private Text titreAlbum;
	
	private final Label lblVisualisation ;
	private final Combo labelOrdre;
	
	private final TableViewer tableViewer;
	private Text erreurCreation;
	private Text titre;
	private Text sousTitre;
	private Text preface;
	private Text postface;
	
	

	/**
	 * Create the shell.
	 * @param display
	 */
	public GestionLivre(final Display display) {
		super(display, SWT.SHELL_TRIM);
		
		Group grpChoix = new Group(this, SWT.NONE);
		grpChoix.setText("Choix\r\n");
		grpChoix.setBounds(7, 10, 195, 332);
		
		Group grpGestionDesPhotos = new Group(this, SWT.NONE);
		grpGestionDesPhotos.setText("Gestion des photos");
		grpGestionDesPhotos.setBounds(208, 10, 1080, 633);
		
		Group grpVisualisation = new Group(grpGestionDesPhotos, SWT.NONE);
		grpVisualisation.setText("Visualisation");
		grpVisualisation.setBounds(10, 24, 440, 485);
		
		Group Information = new Group(grpGestionDesPhotos, SWT.NONE);
		Information.setBounds(456, 158, 614, 262);
		Information.setText("Informations livre");
		
		Group grpInformationsPhotos = new Group(grpGestionDesPhotos, SWT.NONE);
		grpInformationsPhotos.setBounds(469, 426, 601, 178);
		grpInformationsPhotos.setText("Informations Photo");
		
		Label lblOrdre = new Label(grpInformationsPhotos, SWT.NONE);
		lblOrdre.setBounds(20, 148, 55, 15);
		lblOrdre.setText("Ordre :");
		
	    labelOrdre = new Combo(grpInformationsPhotos, SWT.NONE);
		labelOrdre.setBounds(108, 143, 91, 23);
		
		final Button infoPrive = new Button(Information, SWT.CHECK);
		final Button infoPublic = new Button(Information, SWT.CHECK);
		infoPrive.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				
				infoPublic.setSelection(false);
			}
		});
		infoPrive.setText("Privé");
		infoPrive.setBounds(114, 87, 47, 16);
		

		infoPublic.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				
				infoPrive.setSelection(false);
			}
		});
		infoPublic.setText("Public");
		infoPublic.setBounds(168, 87, 93, 16);
		
	    lblVisualisation  = new Label(grpVisualisation, SWT.NONE);
		lblVisualisation.setBounds(10, 25, 400, 400);
		
	    tableViewer = new TableViewer(grpChoix, SWT.BORDER | SWT.FULL_SELECTION);
		table = tableViewer.getTable();
		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				
				erreur.setText("");
							
				ordre = 1 ;
											
				org.eclipse.swt.graphics.Point p = new org.eclipse.swt.graphics.Point(e.x,e.y);
				
				ViewerCell cell = tableViewer.getCell(p);
				
				if(cell != null){
				
				element = (String) cell.getElement() ;
				
							
				
					idAlbum = Album.getElementId(element);
					
					idLivre = Album.getElementIdLivre(element);
					
					String chemin = Album.afficher(idAlbum ,  ordre);
					
					infoPublic.setSelection(false);
					infoPrive.setSelection(false);
					
					if(Album.isVisible(idAlbum)){
						infoPublic.setSelection(true);			
					}else{
						infoPrive.setSelection(true);
					}
					
					InfoAlbum album = Livre.GetInfoLivre(idLivre);
					
					
					sousTitre.setText("");
					preface.setText("");
					postface.setText("");
				
					titre.setText(album.getTitre());
					
					if(album.getSousTitre() != null)
					sousTitre.setText(album.getSousTitre());
					
					if(album.getPostface() != null)
					postface.setText(album.getPostface());
					
					if(album.getPreface() != null)
					preface.setText(album.getPreface());
					
					labelOrdre.removeAll();
					
					int labelMax = Album.getMaxOrdre(idAlbum);
					
					for (int i =1 ; i <= labelMax ; i++ ){
						
						labelOrdre.add(String.valueOf(i), i-1);
					}
					
					if(chemin == null){
						
						erreur.setText("Erreur :\r\n Pas de photo dans cet album ");
						
						lblVisualisation.setImage(null);
					}
					else{
						
						loadImageViewer(display, chemin);				
					}
				}
				
			}
		});
		table.setBounds(3, 15, 189, 313);
		

		
		Button button = new Button(grpVisualisation, SWT.NONE);
		button.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				
				ordre = ordre - 1;
				
				erreur.setText("");
				if(element == null){
					
					erreur.setText("Erreur :\r\nVous n'avez pas choisi \r\nd'album");
					
				}else {
					
					if(ordre <=0 )
					{
						ordre = 1 ;
						erreur.setText("Erreur :\r\n Pas ou plus de photo dans cet album");
						
					}			
					else{
						
							String chemin = Album.afficher(idAlbum, ordre);
							
							if(chemin == null){
								
								erreur.setText("Erreur :\r\n Erreur :\r\n Pas ou plus de photo dans cet album ");
								
							}
							
						else{	
							
							loadImageViewer(display, chemin);			
						}
					}
					
					
				}
							
			}
		});
		button.setText("Image précédente");
		button.setBounds(10, 445, 109, 25);
		
		Button button_1 = new Button(grpVisualisation, SWT.NONE);
		button_1.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				
				erreur.setText("");
				
				if(element == null){
					
					erreur.setText("Erreur :\r\nVous n'avez pas choisi \r\nd'album");
					
				}else {
						
					ordre = ordre + 1;
					
					String chemin = Album.afficher(idAlbum, ordre);
					
					if(chemin == null){
						
						erreur.setText("Erreur :\r\n Pas ou plus de photo dans cet album");
						
						ordre -= 1 ;
						
					}
					else{
						
						loadImageViewer(display, chemin);	
					}
				}
				
				
			}
		});
		button_1.setText("Image suivante");
		button_1.setBounds(300, 445, 109, 25);
		
		Button btnAjouterUneImage = new Button(grpVisualisation, SWT.NONE);
		btnAjouterUneImage.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				
				erreur.setText("");
				
				if(idAlbum == 0){
					
					erreur.setText("Erreur :\r\nVous n'avez pas choisi \r\nd'album");
					
				}else {
				
				
					try {
						Display display = Display.getDefault();
												
						AjouterPhoto shell = new AjouterPhoto(display,idAlbum);
						shell.open();
						shell.layout();
						while (!shell.isDisposed()) {
							if (!display.readAndDispatch()) {
								display.sleep();
							}
						}
					} catch (Exception e1) {
						e1.printStackTrace();
					}
					
					ordre = 1;
					
					idAlbum = Album.getElementId(element);
					
					String chemin = Album.afficher(idAlbum ,  ordre);
					
					labelOrdre.removeAll();
					
					int labelMax = Album.getMaxOrdre(idAlbum);
					
					for (int i =1 ; i <= labelMax ; i++ ){
						
						labelOrdre.add(String.valueOf(i), i-1);
					}
					
					if(chemin == null){
						
						erreur.setText("Erreur :\r\n Pas de photo dans cet album ");
						
					}
					else{		
						
						loadImageViewer(display, chemin);			
					}
									
				}
				
				
			}
		});
		btnAjouterUneImage.setBounds(142, 445, 140, 25);
		btnAjouterUneImage.setText("Ajouter une Image");
		

		
		Button btnNewButton = new Button(grpInformationsPhotos, SWT.NONE);
		btnNewButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				
				image = Images.GetInfoImage(idAlbum, ordre);
				
				Images.gererInfoImage(image.getIdImage(), idAlbum , Titre.getText() ,  Commentaire.getText() , Integer.valueOf(labelOrdre.getText()), image.getOrdre() );
				

				ordre = 1;
				
				idAlbum = Album.getElementId(element);
				
				String chemin = Album.afficher(idAlbum ,  ordre);
				
				labelOrdre.removeAll();
					
				int labelMax = Album.getMaxOrdre(idAlbum);
				
				for (int i =1 ; i <= labelMax ; i++ ){
					
					labelOrdre.add(String.valueOf(i), i-1);
				}
				
				if(chemin == null){
					
					erreur.setText("Erreur :\r\n Pas de photo dans cet album ");
					
				}
				else{		
					
					loadImageViewer(display, chemin);			
				}
				
			}
		});
		btnNewButton.setBounds(253, 143, 151, 25);
		btnNewButton.setText("Valider les changements");
		
		Titre = new Text(grpInformationsPhotos, SWT.BORDER);
		Titre.setBounds(108, 28, 296, 21);
		
		Label lblTitre = new Label(grpInformationsPhotos, SWT.NONE);
		lblTitre.setBounds(20, 31, 55, 15);
		lblTitre.setText("Titre :");
		
		Commentaire = new Text(grpInformationsPhotos, SWT.BORDER | SWT.V_SCROLL | SWT.MULTI);
		Commentaire.setBounds(108, 55, 296, 82);
		
		Label lblCommentaires = new Label(grpInformationsPhotos, SWT.NONE);
		lblCommentaires.setBounds(20, 58, 96, 15);
		lblCommentaires.setText("Commentaires :\r\n");
		
		Group grpAction = new Group(grpGestionDesPhotos, SWT.NONE);
		grpAction.setBounds(456, 31, 614, 121);
		grpAction.setText("Création livre");
		
		final Button checkPublic = new Button(grpAction, SWT.CHECK);
		final Button checkPrive = new Button(grpAction, SWT.CHECK);
		checkPublic.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				
				checkPrive.setSelection(false);
				
			}
		});
		checkPublic.setBounds(139, 64, 93, 16);
		checkPublic.setText("Public");
		

		checkPrive.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				
				checkPublic.setSelection(false);
				
			}
		});
		checkPrive.setBounds(78, 64, 55, 16);
		checkPrive.setText("Privé");
		
		Button btnCrationDeLalbum = new Button(grpAction, SWT.NONE);
		btnCrationDeLalbum.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				
				if(titreAlbum.getText() == ""){
					
					erreurCreation.setText("Vous n'avez pas choisi le titre du Livre");
							
				}
				else if ( (checkPrive.getSelection() == false) && (checkPublic.getSelection() == false) ){
					
					erreurCreation.setText("Vous n'avez pas choisi la visibilité du Livre");
					
				}
				else if(checkPrive.getSelection()){
					
					Livre.creationLivre(titreAlbum.getText(), 0);
					erreurCreation.setText("");
					
				}else
				{
					Livre.creationLivre(titreAlbum.getText(), 1);
					erreurCreation.setText("");
				}
				
				
				loadLivre();
				
				
			}
		});
		btnCrationDeLalbum.setBounds(283, 86, 121, 25);
		btnCrationDeLalbum.setText("Création du livre");
		
		titreAlbum = new Text(grpAction, SWT.BORDER);
		titreAlbum.setBounds(79, 28, 264, 21);
		
		Label lblTitre_1 = new Label(grpAction, SWT.NONE);
		lblTitre_1.setBounds(10, 31, 55, 15);
		lblTitre_1.setText("Titre :");
		
		Label lblVisibilit = new Label(grpAction, SWT.NONE);
		lblVisibilit.setBounds(10, 64, 55, 15);
		lblVisibilit.setText("Visibilité :");
		
		erreurCreation = new Text(grpAction, SWT.NONE);
		erreurCreation.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_BACKGROUND));
		erreurCreation.setBounds(10, 90, 267, 21);
		

		
		Label label = new Label(Information, SWT.NONE);
		label.setText("Titre  :");
		label.setBounds(23, 26, 55, 15);
		
		titre = new Text(Information, SWT.BORDER);
		titre.setBounds(114, 25, 260, 21);
		
		Label label_1 = new Label(Information, SWT.NONE);
		label_1.setText("Sous Titre  :\r\n");
		label_1.setBounds(23, 58, 86, 15);
		
		sousTitre = new Text(Information, SWT.BORDER);
		sousTitre.setBounds(114, 55, 260, 21);
		
		Label label_2 = new Label(Information, SWT.NONE);
		label_2.setText("Visibilité :");
		label_2.setBounds(23, 88, 55, 15);
		
		Button btnSupprimerLalbum = new Button(Information, SWT.NONE);
		btnSupprimerLalbum.setBounds(318, 227, 121, 25);
		btnSupprimerLalbum.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				
				
				Album.deleteAlbum(idAlbum);
				loadLivre();
				lblVisualisation.setImage(null);
				
			}
		});
		btnSupprimerLalbum.setText("Supprimer livre");
		
		Button button_3 = new Button(Information, SWT.NONE);
		button_3.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent e) {
				
				int check;
				if(infoPublic.getSelection()){
					check = 1 ;
				}else
				{
					check = 0 ;
				}
				
				Livre.gererInfoLivre(idLivre,idAlbum, titre.getText(), sousTitre.getText(), check,preface.getText(),postface.getText());
				loadLivre();
			}
		});
		button_3.setText("Valider les changements");
		button_3.setBounds(453, 227, 151, 25);
		
		Group grpPrface = new Group(Information, SWT.NONE);
		grpPrface.setText("Préface");
		grpPrface.setBounds(23, 109, 276, 111);
		
		preface = new Text(grpPrface, SWT.BORDER | SWT.V_SCROLL | SWT.MULTI);
		preface.setBounds(24, 19, 242, 82);
		
		Group grpPostface = new Group(Information, SWT.NONE);
		grpPostface.setText("Postface");
		grpPostface.setBounds(308, 109, 276, 111);
		
		postface = new Text(grpPostface, SWT.BORDER | SWT.V_SCROLL | SWT.MULTI);
		postface.setBounds(24, 19, 242, 82);
		
		erreur = new Text(this, SWT.BORDER | SWT.CENTER | SWT.MULTI);
		erreur.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_BACKGROUND));
		erreur.setBounds(10, 348, 192, 178);
		

		loadLivre();
		
		createContents();
		

		
	}

	/**
	 * Create contents of the shell.
	 */
	protected void createContents() {
		setText("Gestion de mes Albums");
		setSize(1314, 686);

	}

	@Override
	protected void checkSubclass() {
		// Disable the check that prevents subclassing of SWT components
	}
	
	
	private void loadLivre(){
		
		Album.removeAlbum();
		
	    // The input will be an array or a collection.
	    // We will need every element of this input.
		tableViewer.setContentProvider( new ArrayContentProvider());
		
	    // For very element to display, we will display its default string
		// (i.e. Object#toString()).
		tableViewer.setLabelProvider( new LabelProvider());
			
		Livre.getLivre(visible);
				
	    // Eventually, let's define an input
		List<InfoAlbum> listAlbumPrive = Album.getList();
		
		 List<String> listAlbumString = new ArrayList<String>();
		 
		 int i = 0 ;
		 
		 while( i < listAlbumPrive.size()) {
			 
			 listAlbumString.add(listAlbumPrive.get(i).getTitre());
			 i++;
		 }
		
		
		tableViewer.setInput( listAlbumString );
		
		
	}
	
	private void loadImageViewer(final Display display, String chemin){
		
		
		InfoImage image = Images.GetInfoImage(idAlbum, ordre);
		
		if((image.getTitre()!=null)&&(image.getCommentaire()!=null)){
			Titre.setText(image.getTitre());
			Commentaire.setText(image.getCommentaire());
		}
		else{
			Titre.setText("");
			Commentaire.setText("");
		}
		
		labelOrdre.select(image.getOrdre() - 1);
		
		
		Image imageVisualisation = new Image(display,chemin) ;
		
		imageVisualisation = resize(imageVisualisation,400,400);
		
		lblVisualisation.setImage(imageVisualisation);
		
	}
	
	
	
	private Image resize(Image image, int width, int height) {
		
		Image scaled = new Image(Display.getDefault(), width, height);
		GC gc = new GC(scaled);
		gc.setAntialias(SWT.ON);
		gc.setInterpolation(SWT.HIGH);
		gc.drawImage(image, 0, 0, 
		image.getBounds().width, image.getBounds().height, 
		0, 0, width, height);
		gc.dispose();
		image.dispose(); // don't forget about me!
		return scaled;
		}
}

